『詳解 Rustアトミック操作とロック』
https://gyazo.com/1138774947d1111bbd6750a91b305e45
2023/11/14
書評
序文
まえがき
1章 Rust並行性の基本
1.1 Rustのスレッド
1.2 スコープ付きスレッド
1.3 所有権の共有と参照カウント
1.3.1 static
1.3.2 リーク
1.3.3 参照カウント
1.4 借用とデータ競合
1.5 内部可変性
1.5.1 Cell
1.5.2 RefCell
1.5.3 MutexとRwLock
1.5.4 アトミック型
1.5.5 UnsafeCell
1.6 スレッド安全性:SendとSync
1.7 ロック:MutexとRwLock
1.7.1 RustのMutex
1.7.2 毒されたロック
1.7.3 リーダ・ライタ・ロック
1.8 待機:パーキングと条件変数
1.8.1 スレッドパーキング
1.8.2 条件変数
1.9 まとめ
2章 アトミック操作
2.1 アトミックロードとストア操作
2.1.1 例:ストップフラグ
2.1.2 例:進捗レポート
2.1.3 例:遅延初期化
2.2 読み込み更新操作
2.2.1 例:複数スレッドからの進捗レポート
2.2.2 例:統計値
2.2.3 例:IDの発行
2.3 比較交換操作
2.3.1 例:オーバフローのないIDの発行
2.3.2 例:一度だけ行われる遅延初期化
2.4 まとめ
3章 メモリオーダリング
3.1 リオーダと最適化
3.2 メモリモデル
3.3 先行発生関係
3.3.1 スレッドの起動とジョイン
3.4 Relaxedオーダリング
3.5 Release/Acquireオーダリング
3.5.1 例:ロック
3.5.2 例:間接参照を用いた遅延初期化
3.6 Consumeオーダリング
3.7 Sequentially Consistentオーダリング
3.8 フェンス
3.9 よくある誤解
3.10 まとめ
4章 スピンロックの実装
4.1 最小限の実装
4.2 unsafeなスピンロック
4.3 ロックガードを用いた安全なインターフェイス
4.4 まとめ
5章 チャネルの実装
5.1 単純なMutexを用いたチャネル
5.2 unsafeなワンショットチャネル
5.3 実行時チェックによる安全性
5.4 型による安全性
5.5 借用を用いてメモリ確保を避ける
5.6 ブロッキング
5.7 まとめ
6章 Arcの実装
6.1 基本的な参照カウント
6.1.1 テスト
6.1.2 更新
6.2 weakポインタ
6.2.1 テスト
6.3 最適化
6.4 まとめ
7章 プロセッサを理解する
7.1 プロセッサ命令
7.1.1 ロードとストア
7.1.2 リード・モディファイ・ライト
7.1.3 Load-Linked命令とStore-Conditional命令
7.2 キャッシュ
7.2.1 キャッシュ一貫性
7.2.2 性能への影響
7.3 リオーダ
7.4 メモリオーダリング
7.4.1 x86-64:強く順序付けされたアーキテクチャ
7.4.2 ARM64:弱く順序付けされたアーキテクチャ
7.4.3 実験
7.4.4 メモリフェンス
7.5 まとめ
8章 OSプリミティブ
8.1 カーネルとのインターフェイス
8.2 POSIX
8.2.1 Rustでラップする
8.3 Linux
8.3.1 Futex
8.3.2 Futex操作
8.3.3 Futex操作の優先度継承
8.4 macOS
8.4.1 os_unfair_lock
8.5 Windows
8.5.1 重量カーネルオブジェクト
8.5.2 軽量オブジェクト
8.5.3 アドレスベースの待機
8.6 まとめ
9章 ロックの実装
9.1 Mutex
9.1.1 システムコールを避ける
9.1.2 さらなる改良
9.1.3 ベンチマーク
9.2 条件変数
9.2.1 システムコールを避ける
9.2.2 偽の待機解除を避ける
9.3 リーダ・ライタ・ロック
9.3.1 ライタのビジーループを回避する
9.3.2 ライタ・スタベーションの回避
9.4 まとめ
10章 アイディアとインスピレーション
10.1 セマフォ
10.2 RCU
10.3 ロックフリー連結リスト
10.4 キューベースのロック
10.5 パーキングロットベースロック
10.6 シーケンスロック
10.7 学習教材
索引